/**
 * frequency-based policies
 * 基于频率的策略
 */
/* eslint-disable jsdoc/require-property-description */
/**
 * @desc 淘汰使用频率最少的数据
 * @typedef {object} LFU
 * @property { (key: number) => number } get
 * @property { (key: number, value: number) => void } put
 */

export const polling = {};

/**
 * @template T
 */
class LFUItem {
  /**
   * @param {string | number} key
   * @param {T} value
   * @param {number} freq
   */
  constructor(key, value, freq = 1) {
    this.key = key;
    this.value = value;
    this.freq = freq;
  }
}

class LFUCache {
  constructor() {
    this.cache = new Map();
    this.freq = [];
    this.minFreq = 0;
  }
}

// 理想 LFU(Ideal LFU)：目录中的每个项都有一个计数器
class IdealLFUCache extends LFUCache {
  constructor() {
    super();
  }
}
// 实用 LFU：缓存中存储的项目有一个计数器。如果项目被驱逐，该计数器将被遗忘。
class PracticalLFUCache extends LFUCache {
  constructor() {
    super();
  }
}
